package com.raowb.common.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.raowb.common.base.entitys.BaseTreeEntity;
/**
 * 
* @Description: tree工具 
* @author: RaoWenbiao
* @date 2018年10月25日
 */
public class TreeUtil {

	/**
	 * 构建树形结构
	 * @param treeNodes
	 * @return
	 */
	public static <T extends BaseTreeEntity> List<T> listTree(List<T> treeNodes) {

		List<T> rootList = new ArrayList<>();
		Map<Long, T> treeMap = new HashMap<>();

		for (T node : treeNodes) {
			treeMap.put(node.getId(), node);
		}

		for (T node : treeNodes) {
			if (null == node.getParentId() || treeMap.get(node.getParentId()) == null) {
				rootList.add(node);
			} else {
				if (treeMap.get(node.getParentId()).getTreeChildList() == null) {
					treeMap.get(node.getParentId()).setTreeeChildList(new ArrayList<>());
				}
				treeMap.get(node.getParentId()).getTreeChildList().add(node);
			}
		}

		return rootList;
	}

	/**
	 * 按层级排序（上级排在前面）
	 * @param treeNodes
	 * @return
	 */
	public static List<BaseTreeEntity> sortTreeByHierarchy(List<BaseTreeEntity> treeNodes) {
		treeNodes = listTree(treeNodes);
		List<BaseTreeEntity> rtnList = new ArrayList<>();
		for (BaseTreeEntity node : treeNodes) {
			rtnList.addAll(sortTreeByHierarchy(node));
		}
		return rtnList;
	}

	/**
	 * 按层级排序 递归
	 * @param treeNodes
	 * @return
	 */
	private static List<BaseTreeEntity> sortTreeByHierarchy(BaseTreeEntity root) {
		List<BaseTreeEntity> rtnList = new ArrayList<>();
		rtnList.add(root);
		if (root.getTreeChildList() != null) {
			for (BaseTreeEntity node : root.getTreeChildList()) {
				rtnList.addAll(sortTreeByHierarchy(node));
			}
		}
		
		return rtnList;
	}

	// /**
	// * 使用递归方法建树
	// * @param treeNodes
	// * @return
	// */
	// public static List<BaseTreeEntity> buildTree(List<BaseTreeEntity>
	// treeNodes) {
	//
	// Map<String, BaseTreeEntity> treeMap = new HashMap<>();
	//
	// for (BaseTreeEntity node : treeNodes) {
	// treeMap.put(node.getId(), node);
	// }
	//
	// List<BaseTreeEntity> trees = new ArrayList<BaseTreeEntity>();
	// for (BaseTreeEntity node : treeNodes) {
	// if (StringUtil.isBlank(node.getParentId()) ||
	// treeMap.get(node.getParentId()) == null) {
	// trees.add(findChildren(node, treeNodes));
	// }
	// }
	// return trees;
	// }
	//
	// /**
	// * 递归查找子节点
	// * @param treeNodes
	// * @return
	// */
	// private static BaseTreeEntity findChildren(BaseTreeEntity parentNode,
	// List<BaseTreeEntity> treeNodes) {
	// for (BaseTreeEntity it : treeNodes) {
	// if (parentNode.getId().equals(it.getParentId())) {
	// if (parentNode.getChildList() == null) {
	// parentNode.setChildList(new ArrayList<BaseTreeEntity>());
	// }
	// parentNode.getChildList().add(findChildren(it, treeNodes));
	// }
	// }
	// return parentNode;
	// }
	//
	// public static void main(String[] args) {
	//
	// }
}
